CREATE OR REPLACE FUNCTION get_products_by_number_of_orders()
RETURNS TABLE (
    product_code INT,
    product_description TEXT,
    product_price NUMERIC,
    number_of_orders BIGINT
)
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY
    SELECT
        p.code AS product_code,
        p.description AS product_description,
        p.price AS product_price,
        COUNT(DISTINCT o.order_num) AS number_of_orders
    FROM product p
    JOIN includes i
        ON p.code = i.code
    JOIN "order" o
        ON i.order_num = o.order_num
    GROUP BY
        p.code,
        p.description,
        p.price
    ORDER BY
        number_of_orders DESC;
END;
$$;